How to use the built-in PHP Web Server

(Originally posted on my Portuguese blog at rberaldo.com.br)

Until PHP 5.3, it was necessary to install a web server, such as Apache, Nginx, or IIS, to run PHP scripts in the browser.

In development environments, where typically only one user is making HTTP requests for testing, running Apache for this purpose is excessive.

Fortunately, starting from PHP 5.4, there’s a built-in server for local testing. You don’t need to install a web server in your development environment.

It’s important to note that this is a simple, single-threaded server meant for testing. Do not use it in production environments!

With PHP 5.4 or later installed, navigate to the directory where you want to run the server (the root of your web project), and execute the following command in your Terminal:

cd your/web/project/directory
php -S localhost:8080

“localhost” is the address, and it can be an IP (e.g., 127.0.0.1) or a hostname like “localhost.” The port can be any available port. I used 8080 as an example, but it could be the default port 80, as long as you have permission to use ports below 1024 (root privileges are required for this).

After that, you can access http://localhost:8080 in your web browser, and you will see your files. To stop the server, simply type CTRL+C in the terminal.

This server does not support Mod Rewrite, so you can’t use .htaccess as you would with Apache or Nginx.

However, you can achieve similar behavior by using a routing file.

Create a file called “route.php” (or any other name you prefer) with the following content:

<?php

if (preg_match('/\.(?:png|jpg|jpeg|gif)$/', $_SERVER["REQUEST_URI"])) {
    // shows the requested file
    return false;
} else {
    // shows the index.php file
    include __DIR__ . '/index.php';
}

This code will route all requests (except for images) to the “index.php” file. Then, you can start the server by calling the route file:

php -S localhost:8000 route.php

Related posts

17 Thoughts to “How to use the built-in PHP Web Server”

  1. Fiz os testes no servidor built-in do PHP logo que a versão 5.4 foi lançada com essa novidade.
    Gostei bastante do serviço por ser rápido no response e consumir poucos recursos da máquina.
    Além disso aceita muito bem rewrites.

    1. Ronaldo

      Beraldo, eu tentei usar o mod_rewrite com o servidor nativo, mas não está funcionando.

      Segue meu exemplo:
      criei um arquivo php chamado teste.phpm segue código fonte abaixo:

      Criei o .htaccess, segue abaixo:

      RewriteEngine On
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

      Sendo que, quando digito: localhost/categorias, era para imprimir categorias, porém não imprime nada.
      O que estou fazendo de errado?

      1. Olá, Ronaldo

        O servidor nativo não lê o .htaccess. É necessário passar um arquivo de rotas, como este:

        if (preg_match(‘/\.(?:png|jpg|jpeg|gif)$/’, $_SERVER[“REQUEST_URI”])) {
        return false;
        }
        else
        {
        include __DIR__ . ‘/index.php’;
        }

        Depois inicie o servidor:

        php -S localhost:8000 route.php

        Atualizei o post com essa informação. Dê uma olhada 😉

        Abraço

  2. Danilo

    Cara, muito bom o post! Desconhecia dessa opção.
    Só corrigindo ali, pra parar no Windows, é Ctrl+C, também 🙂

    1. Obrigado pela correção, Danilo. Já arrumei o post.

      CTRL+Z no Windows é End-Of-File, o mesmo que CTRL+D em Unix-Like. Eu me confundi na hora de escrever, mesmo. 🙂

  3. Guilherme

    Não entendi direito como usar o servidor nativo do PHP no windows. Preciso baixar o php para windows e usar, só isso?
    Aparentemente fiz tudo como está no post, mas não deu certo.

    1. Por que não deu certo? O que ocorreu? Deu erro? Se sim, qual?
      Não testei no Windows, mas conheço quem já testou e funcionou corretamente.

  4. Tiago

    Ótimo “post”. Funcionou perfeitamente no meu linux.

  5. Helder Tosta

    Bom Dia Beraldo, primeiramente parabéns pelo conteúdo de excelente qualidade.
    Eu tenho uma dúvida quanto ao servidor nativo do php. Quando eu clico em um link que redireciona para outro arquivo do meu projeto o apache redireciona automaticamente, porém o php não coloca o nome da pasta na url, fazendo assim com que o navegador mostre como arquivo não encontrado. Como posso resolver isso?

    1. Olá. Primeiramente, obrigado! 🙂
      Como está o link? Provavelmente está sem a pasta. Se o apache gera outro link, deve ser uma regra do .htaccess. O link clicado é enviado ao navegador pelo próprio HTML, o PHP só entra na brincadeira quando a requisição é feita.

      1. Helder Tosta

        São dois arquivos na pasta raiz do meu sistema. Quando acesso localhost/meuprojeto ele já vai direto no arquivo localhost/meuprojeto/index.php só que quando clico no link que leva para o arquivo cadastro.php que fica no mesmo diretório ao invés de ir para o caminho localhost/meuprojeto/cadastro.php ele tenta acessar o caminho localhost/cadastro.php.

          1. De fato, o servidor vai para a raiz. Eu nunca tinha passado por isso.
            De qualquer forma, é sempre ideal usar caminhos completos. Isso evita esse tipo de problema. Também existe a opção -t, que altera o diretório raiz, ou seja, o DocumentRoot.
            De qualquer forma, o ideal seria usar um sistema de rotas, como explico neste artigo: http://rberaldo.com.br/urls-amigaveis-sem-htaccess-usando-slim/

          2. Helder Tosta

            Ok muito obrigado pela atenção e pelas dicas.

          3. Helder Tosta

            Acabei descobrindo o problema. O erro estava acontecendo porque eu iniciei o servidor nativo do php em um diretório que tinha vários projetos em subdiretórios. No caso o problema foi resolvido quando eu iniciei o servidor a partir do diretório do projeto específico.

          4. O ideal é iniciar na raiz do projeto, mesmo. Outra possibilidade é usar a opção -t, como sugeri antes. O efeito é praticamente o mesmo.
            Que bom que resolveu 🙂

Leave a Comment